package com.lsh.datasource;

import lombok.extern.slf4j.Slf4j;

/**
 * 数据源切换处理
 * @Date 2021年05月20日10:07:21
 * @author LiuShihao
 *
 * 封装一个的对数据源进行操作的类 DynamicDataSourceContextHolder
 */
@Slf4j
public class DynamicDataSourceContextHolder {

    /**
     * 使用ThreadLocal维护变量，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
     *  所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 设置数据源的变量
     * 设置当前线程的线程局部变量的值。
     */
    public static void setDataSourceType(String dsType) {
        log.info("切换到{}数据源", dsType);
        CONTEXT_HOLDER.set(dsType);
    }

    /**
     * 返回当前线程所对应的线程局部变量。
     * 获得数据源的变量
     */
    public static String getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 清空数据源变量
     * 将当前线程局部变量的值删除，目的是为了减少内存的占用，
     * 该方法是JDK 5.0新增的方法。需要指出的是，当线程结束后，对应该线程的局部变量将自动被垃圾回收，所以显式调用该方法清除线程的局部变量并不是必须的操作，但它可以加快内存回收的速度。
     */
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }
}
